最近在使用minio做图片存储,在使用过程中遇到一些问题,总结记录下来。这里不对minio做过多介绍,具体资料自行查找.
1、官网地址 https://min.io/
2、github地址 https://github.com/minio/minio
3、windows 服务端下载地址 https://dl.minio.io/server/minio/release/windows-amd64/minio.exe
4、安装启动
启动一个cmd窗口,进入minio.exe所在文件夹,输入如下命令 注:miniodata是需自己创建图片上传之后的存储目录
.\minio.exe server H:\DevelopTools\miniodata运行成功之后,会看到下面的界面
使用命令行界面给出的地址都可以登录,账号密码都在地址下面。登录后如下图所示。
在后台管理界面上你可以创建你的Bucket(桶),可以理解为一个文件夹用来存放图片。桶创建成功之后就可以上传图片了
springboot整合minio实现文件预览上传和下载第一步:引入依赖
io.miniominio7.1.0第二步:配置参数类
/** * minio相关配置 也可以配置在yml文件 */@Componentpublic class ParamConfig {public static String endpoint = "http://127.0.0.1:9000";public static String accessKey = "minioadmin";public static String secretKey = "minioadmin";public static String bucketName = "uavtest";}第三步:添加MinIoUtil
import cn.hutool.core.date.DateUtil;import io.minio.MinioClient;import io.minio.PutObjectOptions;import io.minio.messages.Bucket;import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;import org.springframework.web.multipart.MultipartFile;import javax.annotation.PostConstruct;import java.io.InputStream;import java.util.Date;import java.util.List;/** * Minio工具类 */@Slf4j@Componentpublic class MinIoUtil {public static MinioClient minioClient;public static ParamConfig paramConfig;/** * 初始化minio配置 */@PostConstructpublic void init() {try {log.info("Minio Initialize........................");minioClient = MinioClient.builder().endpoint(paramConfig.endpoint).credentials(paramConfig.accessKey, paramConfig.secretKey).build();createBucket(paramConfig.bucketName);log.info("Minio Initialize........................successful");} catch (Exception e) {e.printStackTrace();log.error("初始化minio配置异常: 【{}】", e.fillInStackTrace());}}/** * 判断bucket是否存在 */@SneakyThrows(Exception.class)public static boolean bucketExists(String bucketName) {return minioClient.bucketExists(bucketName);}/** * 创建bucket */@SneakyThrows(Exception.class)public static void createBucket(String bucketName) {boolean isExist = minioClient.bucketExists(bucketName);if (!isExist) {minioClient.makeBucket(bucketName);}}/** * 获取全部bucket */@SneakyThrows(Exception.class)public static List getAllBuckets() {return minioClient.listBuckets();}/** * 文件上传 * * @param bucketName: 桶名 * @param fileName:文件名 * @param filePath:文件路径 */@SneakyThrows(Exception.class)public static void upload(String bucketName, String fileName, String filePath) {minioClient.putObject(bucketName, fileName, filePath, null);}/** * 上传文件 * 返回可以直接预览文件的URL */public static String uploadFile(MultipartFile file) {try {//如果存储桶不存在则创建if (!bucketExists(ParamConfig.bucketName)) {createBucket(ParamConfig.bucketName);}PutObjectOptions putObjectOptions = new PutObjectOptions(file.getInputStream().available(), -1);putObjectOptions.setContentType(file.getContentType());String originalFilename = file.getOriginalFilename();//得到文件流InputStream inputStream = file.getInputStream();//保证文件不重名(并且没有特殊字符)String fileName = ParamConfig.bucketName + DateUtil.format(new Date(), "_yyyyMMddHHmmss") + originalFilename;minioClient.putObject(ParamConfig.bucketName, fileName, inputStream, putObjectOptions);return getPreviewFileUrl(ParamConfig.bucketName, fileName);} catch (Exception e) {e.printStackTrace();return "";}}/** * 文件上传 * 返回下载文件url地址 和下面upload方法仅传参不同 * bucketName 也可以直接从ParamConfig对象中获取 */@SneakyThrows(Exception.class)public static String upload(String bucketName, String fileName, InputStream stream) {minioClient.putObject(bucketName, fileName, stream, new PutObjectOptions(stream.available(), -1));return getPreviewFileUrl(bucketName, fileName);}/** * 文件上传 * 返回下载文件url地址 和上面upload方法仅传参不同 */@SneakyThrows(Exception.class)public static String upload(String bucketName, MultipartFile file) {final InputStream is = file.getInputStream();final String fileName = file.getOriginalFilename();minioClient.putObject(bucketName, fileName, is, new PutObjectOptions(is.available(), -1));is.close();return getPreviewFileUrl(bucketName, fileName);}/** * 删除文件 * * @param bucketName: 桶名 * @param fileName:文件名 */@SneakyThrows(Exception.class)public static void deleteFile(String bucketName, String fileName) {minioClient.removeObject(bucketName, fileName);}/** * 下载文件 *///@SneakyThrows(Exception.class)//public static void download(String bucketName, String fileName, HttpServletResponse response) {//// 获取对象的元数据//final ObjectStat stat = minioClient.statObject(bucketName, fileName);//response.setContentType(stat.contentType());//response.setCharacterEncoding("UTF-8");//response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));//InputStream is = minioClient.getObject(bucketName, fileName);//IOUtils.copy(is, response.getOutputStream());//is.close();//}/** * 获取minio文件的下载或者预览地址 * 取决于调用本方法的方法中的PutObjectOptions对象有没有设置contentType * * @param bucketName: 桶名 * @param fileName:文件名 */@SneakyThrows(Exception.class)public static String getPreviewFileUrl(String bucketName, String fileName) {return minioClient.presignedGetObject(bucketName, fileName);}}第四步:接口中引用
@ResponseBody@PostMapping("/tFlightFileUpload")@ApiOperation(value = "文件上传管理-添加minio")public Response add(@RequestParam("file") MultipartFile file) throws IOException {String url = MinIoUtil.uploadFile(file);return Response.success(url);}注:仔细看工具类中的方法上的注释 可以返回预览文件和下载文件的URL